/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package german.dao;

import com.mysql.jdbc.Connection;
import german.basededatos.crearConexion;
import german.logica.Contacto;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;

/**
 *
 * @author german
 * La aplicación utiliza el patrón de diseño DAO (Data Access Object).
 * Los datos en la base de datos, organizados en entidades o tablas, son
 * accedidos a través de un objeto Java. Así, los datos de la tabla contacto
 * en la base de datos son accedidos por medio de un objeto de tipo
 * ContactoDao, el cual a su vez utiliza la lógica definida para los contactos
 * en la clase Contacto del paquete german.logica.
 */
public class ContactoDao {

    private Connection conexion;

    public ContactoDao() throws SQLException{
        this.conexion = (Connection) crearConexion.getConexion();
    }
    /**
     * Este metodo agrega un contacto a la base de datos.
     * @param c1 Objeto de tipo Contacto. El contacto a agregar
     * @throws SQLException
     */
    public void agregar(Contacto c1) throws SQLException{

        // Ser prepara la sentencia sql
        String sql = "insert into contacto (name, address, tel, email, sex)" +
                "values (?, ?, ?, ?,?)";
        PreparedStatement stmt = conexion.prepareStatement(sql);
        stmt.setString(1, c1.getName());
        stmt.setString(2, c1.getAddress());
        stmt.setString(3, c1.getTel());
        stmt.setString(4, c1.getEmail());
        stmt.setString(5, c1.getSex());

        // se ejecuta la sentencia sql definida previamente
        stmt.execute();
        stmt.close();

    }
    /**
     * Obtiene de la base de datos la lista de contactos.
     * @return Una lista con los contactos que hay en la base de datos.
     * @throws SQLException
     */
    public ArrayList<Contacto> getLista() throws SQLException{
        String sql = "select * from contacto";
        PreparedStatement stmt = this.conexion.prepareStatement(sql);
        ResultSet rs = stmt.executeQuery();

        ArrayList<Contacto> miLista = new ArrayList<Contacto>();

        while(rs.next()){
            Contacto c1 = new Contacto();
            c1.setName(rs.getString("name"));
            c1.setAddress(rs.getString("address"));
            c1.setTel(rs.getString("tel"));
            c1.setEmail(rs.getString("email"));
            c1.setSex(rs.getString("sex"));
            miLista.add(c1);
        }

        rs.close();
        stmt.close();

        return miLista;

    }

        /**
     * Obtiene de la base de datos la lista de contactos.
     * @return Una lista con los contactos que hay en la base de datos.
     * @throws SQLException
     */
    public ArrayList<Contacto> getLista(String name) throws SQLException{
        String sql = "select * from contacto where name like ?";
        PreparedStatement stmt = this.conexion.prepareStatement(sql);
        stmt.setString(1, name);
        ResultSet rs = stmt.executeQuery();

        ArrayList<Contacto> miLista = new ArrayList<Contacto>();

        while(rs.next()){
            Contacto c1 = new Contacto();
            c1.setId(Long.valueOf(rs.getString("id")));
            c1.setName(rs.getString("name"));
            c1.setAddress(rs.getString("address"));
            c1.setTel(rs.getString("tel"));
            c1.setEmail(rs.getString("email"));
            c1.setSex(rs.getString("sex"));
            miLista.add(c1);
        }

        rs.close();
        stmt.close();

        return miLista;

    }

    /**
     * Modifica un contacto que se encuentre en la base de datos.
     * @param c1 El contacto a modificar.
     * @throws SQLException
     */
    public void modificar(Contacto c1) throws SQLException{
        // Ser prepara la sentencia sql
        String sql = "update contacto set name=?, address=?, tel=?, email=?, sex=? "
                + "where id=?";
        PreparedStatement stmt = conexion.prepareStatement(sql);
        stmt.setString(1, c1.getName());
        stmt.setString(2, c1.getAddress());
        stmt.setString(3, c1.getTel());
        stmt.setString(4, c1.getEmail());
        stmt.setString(5, c1.getSex());
        stmt.setLong(6, c1.getId());

        // se ejecuta la sentencia sql definida previamente
        stmt.execute();
        stmt.close();
    }
    /**
     * Elimina un contacto de la base de datos.
     * @param c1 El contacto a ser eliminado de la base de datos.
     * @throws SQLException
     */
    public void eliminar(Contacto c1) throws SQLException{
        String sql = "delete from contacto where id=?";
        PreparedStatement stmt = this.conexion.prepareStatement(sql);
        stmt.setLong(1, c1.getId());
        stmt.execute();
        stmt.close();
    }
}
